//给你一个字符串 s ，仅反转字符串中的所有元音字母，并返回结果字符串。 
//
// 元音字母包括 'a'、'e'、'i'、'o'、'u'，且可能以大小写两种形式出现不止一次。 
//
// 
//
// 示例 1： 
//
// 
//输入：s = "hello"
//输出："holle"
// 
//
// 示例 2： 
//
// 
//输入：s = "leetcode"
//输出："leotcede" 
//
// 
//
// 提示： 
//
// 
// 1 <= s.length <= 3 * 10⁵ 
// s 由 可打印的 ASCII 字符组成 
// 
//
// Related Topics 双指针 字符串 👍 331 👎 0

package leetcode.editor.cn;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

//java:反转字符串中的元音字母
public class Q0345ReverseVowelsOfAString {
    public static void main(String[] args) {
        Solution solution = new Q0345ReverseVowelsOfAString().new Solution();
        String leetcode = new Q0345ReverseVowelsOfAString().new Solution().reverseVowels("leetcode");
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public String reverseVowels(String s) {
            if (s == null || s.length() == 0 || s.length() > 300000) return "";
            Set<Character> set = new HashSet<>(Arrays.asList('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'));
            char[] charArray = s.toCharArray();
            int low = 0, high = charArray.length - 1;
            while (low <= high) {
                if (set.contains(charArray[low])) {
                    if (set.contains(charArray[high])) {
                        swapChar(charArray, low, high);
                        low++;
                        high--;
                    } else {
                        high--;
                    }
                } else {
                    if (set.contains(charArray[high])) {
                        low++;
                    } else {
                        low++;
                        high--;
                    }
                }
            }
            return String.valueOf(charArray);
        }

        public void swapChar(char[] charArray, int i, int j) {
            char temp = charArray[i];
            charArray[i] = charArray[j];
            charArray[j] = temp;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

    }